package cn.edu.gingkoc.simpleems.control;

import cn.edu.gingkoc.simpleems.model.Employee;
import cn.edu.gingkoc.simpleems.model.SalaryGrade;
import cn.edu.gingkoc.simpleems.model.SalaryStatisticInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;

/**
 * 员工管理类
 * ...
 */
public class EmployeeManagement {
    private static final int INITIAL_CAPACITY = 16;
    private Map<Integer, Employee> id2EmployeeMap;

    /**
     * EmployeeManagement构造函数
     * ...
     */
    public EmployeeManagement() {
        this.id2EmployeeMap = new HashMap<>(INITIAL_CAPACITY);
    }

    /**
     * 添加员工
     * ...
     *
     * @param newEmployee 添加的新员工信息
     */
    public void add(final Employee newEmployee) {
        if (id2EmployeeMap.containsKey(newEmployee.getId())) {
            System.out.println(String.format("【SEMS】：工号为[%s]的员工已存在，无法添加该员工！",
                    newEmployee.getId()));
            return;
        }

        this.id2EmployeeMap.put(newEmployee.getId(), newEmployee);
        System.out.println(String.format("【SEMS】：工号为[%s]的员工添加成功！",
                newEmployee.getId()));
    }

    /**
     * 删除员工
     * ...
     *
     * @param employeeID 待删除员工ID
     */
    public void delete(final int employeeID) {
        if (id2EmployeeMap.get(employeeID) == null) {
            System.out.println(String.format("【SEMS】：工号为[%s]的员工不存在，无法删除该员工！",
                    employeeID));
            return;
        }
        this.id2EmployeeMap.remove(employeeID);
        System.out.println(String.format("【SEMS】：工号为[%s]的员工删除成功！", employeeID));
    }

    /**
     * 修改员工信息
     * ...
     *
     * @param modifiedEmployeeInfo 修改后的员工信息
     */
    public void modify(final Employee modifiedEmployeeInfo) {
        int employeeID = modifiedEmployeeInfo.getId();
        Employee existedEmployeeInfo = id2EmployeeMap.get(employeeID);
        if (existedEmployeeInfo == null) {
            System.out.println(String.format("【SEMS】：工号为[%s]的员工不存在，无法修改该员工！",
                    employeeID));
            return;
        }
        id2EmployeeMap.put(employeeID, modifiedEmployeeInfo);
        System.out.println(String.format("【SEMS】：工号为[%s]的员工信息修改成功！",
                employeeID));
    }

    /**
     * 获取所有员工信息
     * ...
     *
     * @return 所有员工列表
     */
    public List<Employee> getAllEmployees() {
        return new ArrayList<>(id2EmployeeMap.values());
    }

    /**
     * 根据员工ID查询员工信息
     * ...
     *
     * @param id 员工ID
     * @return 员工信息
     */
    public Employee getEmployeeByID(final int id) {
        return this.id2EmployeeMap.get(id);
    }

    /**
     * 分段统计员工薪酬
     * 员工分级薪酬统计功能（分高、中、低三段，需要统计每段对应人员的数量，以及每段的平均薪酬），处理业务流程如下：
     * （1）校验当前用户是否具有查询权限：如果用户是管理员，则执行以下操作（2），负责提示“该用户无操作权限”；
     * （2）遍历所有员工的薪酬值，如果低于5000元，则计入低薪酬人数，同时记录累计薪酬值；
     * 如果大于等于5000元，同时低于20000元，则计入中薪酬人数，同时记录累计薪酬值；
     * 如果高于20000元，则计入高薪酬人数，以及累计高薪酬值；
     * （3）计算高、中、低薪酬人员的平均薪酬值；
     * （4）输出高、中、低薪酬人员的数量和各段的平均薪酬值；
     * ...
     *
     * @return 员工薪酬分段统计信息
     */
    public Map<SalaryGrade, SalaryStatisticInfo> countSalaryWithGrading() {
        //所有员工列表
        List<Employee> allEmployees = getAllEmployees();
        //TODO 请基于以上的allEmployees编写薪酬统计功能
        // 初始化计数器
        int lowCount = 0;
        double lowTotalSalary = 0;
        int mediumCount = 0;
        double mediumTotalSalary = 0;
        int highCount = 0;
        double highTotalSalary = 0;

        // 遍历所有员工，统计薪酬
        for (Employee employee : allEmployees) {
            double salary = employee.getSalary(); // 假设Employee类有一个getSalary方法返回薪酬
            if (salary < 5000) {
                lowCount++;
                lowTotalSalary += salary;
            } else if (salary >= 5000 && salary < 20000) {
                mediumCount++;
                mediumTotalSalary += salary;
            } else {
                highCount++;
                highTotalSalary += salary;
            }
        }
        // 计算平均薪酬
        double lowAverageSalary = lowCount > 0 ? lowTotalSalary / lowCount : 0;
        double mediumAverageSalary = mediumCount > 0 ? mediumTotalSalary / mediumCount : 0;
        double highAverageSalary = highCount > 0 ? highTotalSalary / highCount : 0;

        // 创建结果映射
        Map<SalaryGrade, SalaryStatisticInfo> result = new HashMap<>();
        if (lowCount > 0) {
            result.put(SalaryGrade.LOW, new SalaryStatisticInfo(lowCount, lowAverageSalary));
        }
        if (mediumCount > 0) {
            result.put(SalaryGrade.MIDDLE, new SalaryStatisticInfo(mediumCount, mediumAverageSalary));
        }
        if (highCount > 0) {
            result.put(SalaryGrade.HIGH, new SalaryStatisticInfo(highCount, highAverageSalary));
        }
        return result;
    }
}
